home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / t_os / gpen32k / source.exe / LIB / OSRC / FSEL2.C < prev    next >
C/C++ Source or Header  |  1993-08-08  |  5KB  |  229 lines

  1. /*
  2.         Free File Selector V0.21
  3.         ファイルセレクタ快適操作版
  4.                                 Copyright(C)1993 Okome
  5. */
  6.  
  7. #include    <stdio.h>
  8. #include    <string.h>
  9. #include    <dos.h>
  10. #include    <direct.h>
  11. #include    <EGB.H>
  12. #include    <MOS.H>
  13. #include    <kkstr2.h>
  14. #include    <Normlib.h>
  15. #include    <okome.h>
  16.  
  17. #define    FX4        340
  18. #define    FY4        220
  19. #define FX3        (FX4-1)
  20. #define    FY3        (FY4-1)
  21. #define FX2        (FX1+FX3)
  22. #define    FY2        (FY1+FY3)
  23.  
  24. extern char work[];
  25. static int FX1=120,FY1=80;
  26.  
  27. int WIN_MEN_bar(char *tt, int x1, int y1, int x2)
  28. {
  29.     boxbf( x1,y1,x1+x2,y1+15,8,9 );
  30.     boxf(x1,y1,x1+strlen(tt)*6+45,y1+15,8);
  31.     boxbf(x1,y1,x1+15,y1+15,8,4);
  32.     font12(x1+28,y1+13,tt,15);
  33.     return (0);
  34. }
  35.  
  36. static void dvsym(int drv)
  37. {
  38.     char w[2];
  39.     boxbf(FX1+30, FY1+20, FX1+60, FY1+37, 8,15);
  40.     w[0]='A'+drv-1;
  41.     w[1]=0;
  42.     symbol(FX1+41,FY1+36, w, 16, 8);
  43. }
  44.  
  45. static void dvpos(int s, int fx, struct _find_t fls[])
  46. {
  47.     int i,j;
  48.     boxf( FX1+8,FY1+44,FX2-24,FY2-24, 8 );
  49.     boxbf( FX2-20,FY1+44,FX2-4,FY2-24, 8, 9 );
  50.     if (fx!=0)
  51.     {
  52.         j = FY1+44+(FY2-FY1-68)*(s/3)/((fx+2)/3);
  53.         i = j+(FY2-FY1-68)*8/((fx+2)/3);
  54.         if (i > FY2-24)
  55.             i = FY2-24;
  56.         boxbf( FX2-20,j,FX2-4, i, 8, 15 );
  57.         ubox2( FX2-19,j+1,FX2-5, i, 15, 8 );
  58.         for (i = 0; i<3*8 && s+i<fx; i++)
  59.         {
  60.             if ( fls[i+s].attrib & _A_SUBDIR )
  61.             {
  62.                 EGB_color( work, 0, 14 );
  63.             }    else    {
  64.                 EGB_color( work, 0, 15 );
  65.             }
  66.             print( FX1+9+(i % 3)*8*13, FY1+63+i/3*18, fls[i+s].name );
  67.         }
  68.     }    else    {
  69.         symbol(FX1+20,FY1+80,"File not found.",16,2);
  70.     }
  71. }
  72.  
  73. static int dvget( struct _find_t fls[])
  74. {
  75.     int fx = 0;
  76.     struct _find_t fla;
  77.     if (_dos_findfirst("*.*",_A_ARCH | _A_NORMAL | _A_SUBDIR | _A_RDONLY, &fla )==0)
  78.      {
  79.          do
  80.          {
  81.              fls[fx] = fla;
  82.              fx++;
  83.          }    while (_dos_findnext(&fla)==0 && fx<512);
  84.      }
  85.      return (fx);
  86. }
  87.  
  88. int OKM_fsel(char *fna, char *msg, unsigned int drv)
  89. {
  90.     int i, fx, s=0, r=1, mb, mx, my, dmx, dmy, p, k, t=1;
  91.     unsigned int edr, drb;
  92.     struct _find_t fls[512];
  93. /*    struct _diskfree_t fre;    */
  94. /*    char w[8];    */
  95.     p = EGB_getWritePage( 0, 0 );
  96.     KAN_getMode(&k);
  97.     KAN_setMode(0x20000);
  98.     EGB_writePage( work, 0 );
  99.     MOS_disp(0);
  100.     OKM_gth( FX1,FY1, FX2,FY2, 1 );
  101.     boxbf( FX1,FY1,FX2,FY2, 0,15 );
  102.     WIN_MEN_bar( msg,FX1,FY1,FX3 );
  103.     boxb(FX1+20, FY1+20, FX1+70, FY1+37, 8);
  104.     boxb( FX2-40, FY2-21, FX2-4, FY2-3, 8 );
  105.     font12(FX2-33, FY2-5,"実行",8);
  106.     if (drv==0)
  107.     {
  108.         _dos_getdrive(&drv);
  109.     }    else    {
  110.         if (drv>='a' && drv<='z')
  111.             drv -= 'a'-1;
  112.         if (drv>='A' && drv<='Z')
  113.             drv -= 'A'-1;
  114.     }
  115.     _dos_setdrive(drv,&edr);
  116.     _dos_getdrive(&drv);
  117.     dvsym(drv);
  118. /*    _dos_getdiskfree( drv, &fre );
  119.     font12(FX1+100,FY1+36, _itoa( fre.*fre. ,w,10), 8);    */
  120.     fx = dvget(fls);
  121.      dvpos(0, fx, fls);
  122.      boxb( FX1+16, FY2-20, FX1+128, FY2-2, 8 );
  123.     MOS_disp(1);
  124.     do
  125.     {
  126.         MOS_rdpos(&mb,&mx,&my);
  127.         keyin(FX1+22,FY2-19,fna,12,15,8,t);
  128.         t = 0;
  129.         if (mb==1)
  130.         {
  131.             if (mx>FX1+8 && mx<FX2-24 && my>FY1+45 && my<FY2-25)
  132.             {    /*    ファイル    */
  133.                 do    {
  134.                     dmx = (mx-FX1-9)/(8*13);
  135.                     dmy = (my-FY1-45)/18;
  136.                     i = s + dmx + dmy*3;
  137.                     MOS_rdpos(&mb,&mx,&my);
  138.                 }    while (mb!=0);
  139.                 if (i<fx && mx>FX1+8 && mx<FX2-24 && my>FY1+45 && my<FY2-25)
  140.                 {
  141.                     if ((fls[i].attrib & _A_SUBDIR)==0)
  142.                     {
  143.                         strcpy(fna,fls[i].name);
  144.                         t = 1;
  145.                     }    else    {
  146.                         MOS_disp(0);
  147.                         _chdir(fls[i].name);
  148.                         s = 0;
  149.                         fx = dvget(fls);
  150.                          dvpos(0, fx, fls);
  151.                         MOS_disp(1);
  152.                     }
  153.                 }
  154.             }    else
  155.             if (mx>FX2-20 && mx<FX2-4 && my>FY1+44 && my<FY2-24)
  156.             {
  157.                 i = (((fx+2)/3)*(my-FY1-44)/(FY2-FY1-68))*3;
  158.                 if (i!=s)
  159.                 {
  160.                     s = i;
  161.                     MOS_disp(0);
  162.                      dvpos(s, fx, fls);
  163.                     MOS_disp(1);
  164.                 }
  165.             }
  166.             if (my>FY1+20 && my<FY1+37)
  167.             {
  168.                 if (mx>FX1+20 && mx<FX1+30)
  169.                 {
  170.                     do
  171.                     {
  172.                         drv--;
  173.                         if (drv==0)
  174.                             drv = edr;
  175.                         _dos_setdrive(drv,&edr);
  176.                         _dos_getdrive(&drb);
  177.                     }    while(drv!=drb);
  178.                     MOS_disp(0);
  179.                     dvsym(drv);
  180.                     fx = 0;
  181.                     MOS_disp(1);
  182.                     mbout(&i,&dmx,&dmy);
  183.                 }
  184.                 if (mx>FX1+60 && mx<FX1+70)
  185.                 {
  186.                     do
  187.                     {
  188.                         drv++;
  189.                         if (drv>edr)
  190.                             drv=1;
  191.                         _dos_setdrive(drv,&edr);
  192.                         _dos_getdrive(&drb);
  193.                     }    while(drv!=drb);
  194.                     MOS_disp(0);
  195.                     dvsym(drv);
  196.                     fx = 0;
  197.                     MOS_disp(1);
  198.                     mbout(&i,&dmx,&dmy);
  199.                 }
  200.                 if (mx>FX1+30 && mx<FX1+60)
  201.                 {
  202.                     MOS_disp(0);
  203.                     dvsym(drv);
  204.                     fx = dvget(fls);
  205.                     s = 0;
  206.                      dvpos(0, fx, fls);
  207.                     MOS_disp(1);
  208.                     mbout(&i,&dmx,&dmy);
  209.                 }
  210.             }
  211.             if (mx>FX2-40 && mx<FX2-4 && my>FY2-21 && my<FY2-3)
  212.             {
  213.                 r = 0;
  214.             }
  215.         }
  216.         if (mb==2 || (mb && mx>FX1 && mx<FX1+15 && my>FY1 && my<FY1+15))
  217.         {
  218.             r =-1;
  219.         }
  220.     }    while (r==1);
  221.     mbout(&mb,&mx,&my);
  222.     MOS_disp(0);
  223.     OKM_gth( FX1,FY1, FX2,FY2, 0 );
  224.     MOS_disp(1);
  225.     EGB_writePage( work, p );
  226.     KAN_setMode(k);
  227.     return (r);
  228. }
  229.